package fr.utbm.tx52.stamp.logic.utils;

import android.location.Address;
import android.location.Location;
import android.media.ExifInterface;
import android.util.Log;
import fr.utbm.tx52.stamp.logic.Constant;
import fr.utbm.tx52.stamp.ui.activity.Main;
import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * Classe permettant de manipuler des coordonn�es GPS
 *
 * @author Julien GONZALVES (julien.gonzalves@utbm.fr) Laurent RUBY
 * (laurent.ruby@utbm.fr)
 */
public class LocalizationUtil
{

	/**
	 * @param _file le fichier contenant les m�tadonn�es GPS
	 * @return le nom de la ville correspondant � la position GPS
	 */
	public static String getCity(File _file)
	{
		String city = Constant.FILE_CITY_UNKNOWN;
		try
		{
			// R�cup�ration de la latitude et longitude dans les m�tadonn�es
			double latitude = getLatitude(_file);
			double longitude = getLongitude(_file);

			if (latitude != Constant.LATITUDE_NOT_DEFINED
				&& longitude != Constant.LONGITUDE_NOT_DEFINED)
			{
				// Utilisation de l'API Google Maps pour transformer coordonn�es GPS en un nom de ville
				List<Address> address = Main.geocoder.getFromLocation(latitude,
					longitude, 1);
				city = address.get(0).getLocality();
			}
		}
		catch (IOException e)
		{
			Log.e(LocalizationUtil.class.getSimpleName(), "", e);
		}
		return city;
	}

	/**
	 * @param _file le fichier contenant les m�tadonn�es GPS
	 * @return true si les coordonn�es sont d�finies faux si elles sont
	 * "inconnues"
	 */
	public static boolean coordinateExists(File _file)
	{
		double latitude = getLatitude(_file);
		double longitude = getLongitude(_file);
		return (latitude != Constant.LATITUDE_NOT_DEFINED && longitude != Constant.LONGITUDE_NOT_DEFINED);
	}

	/**
	 * @param _file le fichier contenant les m�tadonn�es GPS
	 * @return la longitude stock�e dans les m�tadonn�es du fichier
	 */
	public static double getLongitude(File _file)
	{
		ExifInterface exifInterface = initExifInterface(_file.getAbsolutePath());
		double longitude;
		float[] latLong = new float[2];
		if (exifInterface.getLatLong(latLong))
		{
			longitude = latLong[1];
		}
		else
		{
			longitude = Constant.LONGITUDE_NOT_DEFINED;
		}
		return longitude;
	}

	/**
	 * @param _file le fichier contenant les m�tadonn�es GPS
	 * @return la longitude stock�e dans les m�tadonn�es du fichier
	 */
	public static double getLatitude(File _file)
	{
		ExifInterface exifInterface = initExifInterface(_file.getAbsolutePath());
		double latitude;
		float[] latLong = new float[2];
		if (exifInterface.getLatLong(latLong))
		{
			latitude = latLong[0];
		}
		else
		{
			latitude = Constant.LATITUDE_NOT_DEFINED;
		}
		return latitude;
	}

	/**
	 * @param filepath le chemin du fichier � traiter
	 * @return L'interface Exif permettant de lire le contenu des m�tadonn�es
	 */
	private static ExifInterface initExifInterface(String filepath)
	{
		ExifInterface exifInterface = null;
		try
		{
			exifInterface = new ExifInterface(filepath);
		}
		catch (IOException e)
		{
			Log.e(LocalizationUtil.class.getSimpleName(), "", e);
		}
		return exifInterface;
	}

	private static void writeTag(String tag, String content, File _file)
	{
		ExifInterface exifInterface = initExifInterface(_file.getAbsolutePath());
		exifInterface.setAttribute(tag, content);
		try
		{
			exifInterface.saveAttributes();
		}
		catch (IOException ex)
		{
			Log.e(LocalizationUtil.class.getSimpleName(), "", ex);
		}
	}

	public static void writeComment(String comment, File _file)
	{
		writeTag("Comment", comment, _file);
	}

	public static void writeLocation(Location location, File _file)
	{
		writeTag(ExifInterface.TAG_GPS_LATITUDE, "" + location.getLatitude(), _file);
		writeTag(ExifInterface.TAG_GPS_LONGITUDE, "" + location.getLongitude(), _file);
	}
}
